home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / book / src / lib.c < prev    next >
C/C++ Source or Header  |  1993-07-08  |  6KB  |  269 lines

  1. /*
  2.  *  一般的な関数
  3.  
  4.  *  --------------  --  ---------------------------
  5.  *  91/04/14 03:22  01  get_fsize()
  6.  *  91/04/26 21:32  02  kstrlen()
  7.  *  91/05/27 18:28  03  strdup()
  8.  *  91/05/30 17:27  04  center()
  9.  *  91/06/25 00:38  05  iswap()
  10.  *  92/06/11 14:27  06  jstrrchr()
  11. */
  12.  
  13. #include <stdio.h>
  14. #include <stdefs.h>
  15. #include <stdlib.h>
  16. #include <string.h>
  17. #include <ctype.h>
  18. #include "sugi.h"
  19. #include "lib.h"
  20.  
  21. #define iskanji(c)   ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc))
  22. #define iskanji2(c)  ((0x40 <= c && c <= 0x7e) || (0x80 <= c && c <= 0xfc))
  23.  
  24.  
  25. /*  文字列中のスペース/スペース以外を飛ばす  */
  26.  
  27. char    *skipbl( char *str )  /*  先頭のスペースをとばす  */
  28. {
  29.     while( *str && isspace( *str ) ) str ++ ;
  30.     return str ;
  31. }
  32. char    *skipwd( char *str )  /*  先頭の文字をとばす  */
  33. {
  34.     while( *str && !isspace( *str ) ) str ++ ;
  35.     return str ;
  36. }
  37.  
  38.  
  39. /*  指定のファイル・ポインタの指すファイルの大きさを返す  */
  40.  
  41. #ifndef get_fsize
  42. long    get_fsize( FILE *fp )
  43. {
  44.     long    now, fsize ;
  45.  
  46.     now = ftell( fp ) ;
  47.  
  48.     fseek( fp, 0L, SEEK_END ) ;
  49.     fsize = ftell( fp ) ;
  50.  
  51.     fseek( fp, now, SEEK_SET ) ;
  52.  
  53.     return( fsize ) ;
  54. }
  55. #endif
  56.  
  57.  
  58. /*  コピー先を確保し、文字列をコピーする  */
  59.  
  60. #ifndef strdup
  61. char    *strdup( const char *str )
  62. {
  63.     REGS    char    *p ;
  64.  
  65.     if( ( p = (char *)malloc( strlen( str )+1 ) ) != NULL )
  66.         strcpy( p, str ) ;
  67.  
  68.     return p ;
  69. }
  70. #endif
  71.  
  72.  
  73. /*  センタリングする  */
  74.  
  75. char    *center( char *str, int width )
  76. {
  77.     static  char    buf[ 256 ] ;
  78.     auto    int     i, len, left ;
  79.  
  80.     left = ( width - ( len = strlen( str ) ) ) / 2 ;
  81.     if( left*2 + len != width )
  82.         left ++ ;
  83.  
  84.     for( i = 0 ; i < left ; i ++ )
  85.         buf[ i ] = ' ' ;
  86.     strcpy( &buf[ left ], (char *)str ) ;
  87.  
  88.     return( buf ) ;
  89. }
  90.  
  91.  
  92. /*  整数を交換する  */
  93.  
  94. void    iswap( int *a, int *b )
  95. {
  96.     int c ;
  97.  
  98.     c = *a ;
  99.     *a = *b ;
  100.     *b = c ;
  101. }
  102.  
  103.  
  104. /*  シフトJISを考慮し、英大小文字を区別せずに指定データを比較する  */
  105.  
  106. int     jmemicmp( const char *s1, const char *s2, size_t len )
  107. {
  108.     int     i, ret ;
  109.  
  110.     for( i = 0 ; i < len ; i++, s1++, s2++ )
  111.     {
  112.         if( iskanji( *s1 ) )
  113.         {
  114.             if( ( ret = *s1 - *s2 ) != 0 )
  115.                 break ;
  116.             else if( iskanji2( *(s1+1) ) )
  117.             {
  118.                 if( ( ret = *(s1+1) - *(s2+1) ) != 0 )
  119.                     break ;
  120.                 else
  121.                     s1++, s2++, i++ ;
  122.             }
  123.         }
  124.         else if( ( ret = tolower( *s1 ) - tolower( *s2 ) ) != 0 )
  125.             break ;
  126.     }
  127.  
  128.     return ret ;
  129. }
  130.  
  131.  
  132. /*  シフトJISを考慮して、英小文字をすべて大文字にする  */
  133.  
  134. char    *jstrupr( char *str )
  135. {
  136.     REGS    char    *p ;
  137.  
  138.     for( p = str ; *p != '\0' ; p ++ )
  139.         if( iskanji( *p ) && iskanji2( *(p+1) ) )
  140.             p ++ ;
  141.         else
  142.             *p = toupper( *p ) ;
  143.  
  144.     return str ;
  145. }
  146.  
  147.  
  148. /*  シフトJIS文字も1文字として数えるstrlen  */
  149.  
  150. size_t  jstrlen( const char *str )
  151. {
  152.     const char  *p ;
  153.     size_t  len = 0 ;
  154.  
  155.     for( p = str ; *p != '\0' ; p ++, len ++ )
  156.         if( iskanji( *p ) && iskanji2( *(p+1) ) )
  157.             p ++ ;
  158.  
  159.     return( len ) ;
  160. }
  161.  
  162.  
  163. /*  シフトJISを考慮して、文字列を前から検索する  */
  164.  
  165. char    *jstrchr( const char *p, int ch )
  166. {
  167.     if( p != NULL )
  168.         for( ; *p != '\0' ; p ++ )
  169.         {
  170.             if( iskanji( *p ) && iskanji2( *(p+1) ) )
  171.                 p ++ ;
  172.             else if( *p == ch )
  173.                 return (char *)p ;
  174.         }
  175.     return NULL ;
  176. }
  177.  
  178.  
  179. /*  シフトJISを考慮して、文字列を後ろから検索する  */
  180.  
  181. char    *jstrrchr( const char *str, int ch )
  182. {
  183.     const char  *last = NULL ;
  184.  
  185.     if( str == NULL )
  186.         return NULL ;
  187.  
  188.     while( 1 )
  189.     {
  190.         if( ( str = jstrchr( str, ch ) ) != NULL )
  191.             last = str, str++ ;
  192.         else
  193.             return (char *)last ;
  194.     }
  195. }
  196.  
  197.  
  198. /*
  199.  *  printf( "%-*s", column, str ) を代替する
  200. */
  201. char    *formstrL( char *str, int column )
  202. {
  203.     static  char    buf[256] ;
  204.     auto    int     i, len ;
  205.  
  206.     len = strlen( strcpy( buf, str ) ) ;
  207.     for( i = len ; i < column ; i ++ )
  208.         buf[i] = ' ' ;
  209.     buf[i] = '\0' ;
  210.  
  211.     return buf ;
  212. }
  213.  
  214. /*
  215.  *  printf( "%*s", column, str ) を代替する
  216. */
  217. char    *formstrR( char *str, int column )
  218. {
  219.     static  char    buf[256] ;
  220.     auto    int     i, len ;
  221.  
  222.     len = column - strlen( str ) ;
  223.     for( i = 0 ; i < len ; i ++ )
  224.         buf[i] = ' ' ;
  225.     buf[i] = '\0' ;
  226.  
  227.     strcat( buf, str ) ;
  228.  
  229.     return buf ;
  230. }
  231.  
  232. /*
  233.  *  printf( "%*d", value, column ) を代替する
  234. */
  235. static  char    *formdigit( int value, int column, int zerosuppres )
  236. {
  237.     static  char    buf[32] ;
  238.     auto    char    buf2[32] ;
  239.     auto    int     i, len ;
  240.  
  241.     len = column - strlen( _itoa( value, buf2, 10 ) ) ;
  242.     if( zerosuppres )
  243.     {
  244.         for( i = 0 ; i < len ; i ++ )
  245.             buf[i] = '0' ;
  246.         buf[i] = '\0' ;
  247.         strcat( buf, buf2 ) ;
  248.     }
  249.     else
  250.         strcpy( buf, buf2 ) ;
  251.     return buf ;
  252. }
  253.  
  254. char    *formdigitR( int value, int column, int zerosuppres )
  255. {
  256.     auto    char    *str ;
  257.  
  258.     str = formdigit( value, column, zerosuppres ) ;
  259.     return formstrR( str, column ) ;
  260. }
  261. char    *formdigitL( int value, int column, int zerosuppres )
  262. {
  263.     auto    char    *str ;
  264.  
  265.     str = formdigit( value, column, zerosuppres ) ;
  266.     return formstrL( str, column ) ;
  267. }
  268.  
  269.